package editor;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;


public class EditorFrame extends JFrame implements ActionListener, WindowListener {
	private Toolkit tool;
	private Editor editor;
	private JPanel pannelloPrincipale;
	private JMenuBar barraMenu;
	private JMenu menuFile;
	private JMenuItem salvaConNome;
	private JMenuItem salva;
	private JMenuItem nuovo;
	private JMenuItem esci;
	private JMenuItem apri;
	private JMenuItem anteprima;
	public PannelloScelta choose; 
	public PannelloEditor drawArea;
	private JScrollPane scroll;
	
	/**
	 * Crea un nuovo oggetto di tipo EditorFrame.
	 */
	public EditorFrame(){
		super();
		tool = Toolkit.getDefaultToolkit();
		pannelloPrincipale = new JPanel();
		pannelloPrincipale.setLayout(new BorderLayout());
		this.getContentPane().add(pannelloPrincipale);
		
		impostaPannelli(0,0);		
		
		this.setTitle("Level Editor");
		this.setExtendedState(JFrame.NORMAL);
		this.setSize(new Dimension(1050,672));
		this.setLocation(150,50);
		this.setResizable(false);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.addWindowListener(this);
		//editor.getSuoni().playLoop(1);
	}
	
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == salvaConNome){
			editor.setExit(false);
			new DialogSalvaLivello(this);
		}
		else if (e.getSource() == nuovo){
			new DialogNuovoLivello(this);
		}
		else if (e.getSource() == apri){
			new DialogApriLivello(this);
			editor.inizializzaVettoriElementi();
		}
		else if (e.getSource() == anteprima){
			new DialogAnteprima(this.getEditor());
		}
		else if (e.getSource() == salva){
			if (editor.isSalvato()){
				editor.salvaLivello();
			}
			else {
				editor.setExit(false);
				new DialogSalvaLivello(this);
			}
		}
		else if (e.getSource() == esci){
			if (editor.isModificato()){
				editor.setExit(true);
				new DialogUscita(this);
			}
			else {
				this.dispose();
			}
		}
	}
	
	
	/**
	 * Costruisce tutti gli oggetti grafici contenuti nell'EditorFrame e 
	 * inizializza un nuovo Editor con altezza e lunghezza specificata. 
	 * @param width lunghezza Editor da creare
	 * @param height altezza Editor da creare
	 */
	public void impostaPannelli(int width,int height){
		editor = new Editor(width,height);
		choose = new PannelloScelta(editor);
		drawArea = new PannelloEditor(editor);
		menuFile = new JMenu("File");
		esci = new JMenuItem("Esci");
		esci.addActionListener(this);
		salvaConNome = new JMenuItem("Salva con nome");
		salvaConNome.addActionListener(this);
		salva = new JMenuItem("Salva");
		salva.addActionListener(this);
		apri = new JMenuItem("Apri");
		apri.addActionListener(this);
		nuovo = new JMenuItem("Nuovo");
		nuovo.addActionListener(this);
		anteprima = new JMenuItem("Anteprima");
		anteprima.addActionListener(this);
		menuFile.add(nuovo);
		menuFile.add(apri);
		menuFile.add(salva);
		menuFile.add(salvaConNome);
		menuFile.addSeparator();
		menuFile.add(anteprima);
		menuFile.addSeparator();
		menuFile.add(esci);
		barraMenu = new JMenuBar();
		barraMenu.add(menuFile);
		scroll = new JScrollPane(drawArea);
		scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		scroll.setPreferredSize(new Dimension(640,480));
		pannelloPrincipale.add(barraMenu,BorderLayout.NORTH);
		pannelloPrincipale.add(scroll,BorderLayout.CENTER);
		pannelloPrincipale.add(choose,BorderLayout.WEST);
		pannelloPrincipale.updateUI();
	}
	
	/**
	 * Rimuove tutti gli oggetti dal pannello principale
	 * dell'EditorFrame.
	 */
	public void rimuoviTutto(){
		pannelloPrincipale.removeAll();
	}
	
	public void windowClosing(WindowEvent e) {
		if (editor.isModificato()){
			this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
			editor.setExit(true);
			new DialogUscita(this);
		}
		else {
			this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		}
	} 
	
	public void windowOpened(WindowEvent e) {
		new DialogScegliOperazione(this);
	}
	
	public void windowActivated(WindowEvent e) {}
	public void windowClosed(WindowEvent e) {
		editor.getSuoni().stop(choose.getCurrentClip());
	}
	public void windowDeactivated(WindowEvent e){}
	public void windowDeiconified(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	

	public Editor getEditor() {
		return editor;
	}

	public void setEditor(Editor editor) {
		this.editor = editor;
	}

	public PannelloScelta getChoose() {
		return choose;
	}
}
